package pers.lmd.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author lmd
 * @Date 2023/4/6 16:35
 */


@Configuration
public class WebConfig implements WebMvcConfigurer {

    /**
     * 跨域
     *
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  // 配置可以被跨域的路径，可以任意配置，可以具体到直接请求路径
                .allowedOriginPatterns("*")  // 允许所有的请求域名访问我们的跨域资源，可以固定单条或者多条内容
                .allowCredentials(true) // 响应头表示是否可以将对请求的响应暴露给页面。返回true则可以，其他值均不可以
                .allowedMethods("*")   // 允许输入参数的请求方法访问该跨域资源服务器，如：POST、GET、PUT、OPTIONS、DELETE等
                .allowedHeaders("*");  // 允许所有的请求header访问，可以自定义设置任意请求头信息，如：“X-YAUTH-TOKEN”
    }

    /**
     * 资源映射
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**") // 虚拟url路径
                .addResourceLocations("file:C:/Users/10149/Desktop/毕设/pandemic-admin-java/src/main/resources/files/"); // 真实本地路径
    }

    /**
     * 注册 Sa-Token 拦截器，打开注解式鉴权功能
     *
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        // 注册 Sa-Token 拦截器，打开注解式鉴权功能
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 开启路由鉴权,登录拦截 鉴权
            SaRouter.match("/**")
                    .notMatch(notLogin());
        }));
    }

    /**
     * 不登录也可访问的接口列表
     *
     * @return
     */
    public static List<String> notLogin() {

        List<String> allows = new ArrayList<>();
        // 接口放行
        allows.add("/system/login/*");
        allows.add("/system/captcha/*");

        //swagger资源放行
        allows.add("/v2/**");
        allows.add("/v3/**");
        allows.add("/swagger-ui.html/**");
        allows.add("/swagger-ui/**");
        allows.add("/doc.html/**");
        allows.add("/api-docs-ext/**");
        allows.add("/swagger-resources/**");
        allows.add("/webjars/**");
        allows.add("/favicon.ico");
        allows.add("/error");

        return allows;
    }
}

